﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using AcademiaDAO;
using AcademiaEntidades;
using System.Web.Security;

public partial class Administracion_RegistrarExamen : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Para controlar el botan para atras del navegador
        if (Session["Usuario"] == null)
            Response.Redirect("~/Publico/Login.aspx");
        if (!Page.IsPostBack)
        {
            cargarTipoExamen();
            cargarCurso();
            panelProfesor.Visible = false;
            panelBuscarAlumno.Visible = false;
            ViewState["Orden"] = "Nombre";
            ViewState["OrdenAlumno"] = "NombreAlumno";
            cargarSesion();//Cargar los datos de session
        }

    }
    private void cargarSesion()
    {
        lblUsuarioLogueado.Text = ((Usuarios)Session["Usuario"]).Usuario;
        lblRolLogueado.Text = ((Usuarios)Session["Usuario"]).Rol;
    }
    //Metodos para limpiar los textbox
    protected void limpiarBuscar()
    {
        txtLegajoBus.Text = string.Empty;
        txtNombreBus.Text = string.Empty;
        txtApellidoBus.Text = string.Empty;
        lblResultadoBus.Text = string.Empty;
    }//Fin metodo limpiarBuscar()
    private void cargarTipoExamen()
    {
        try
        {
            ddlTipoExamen.DataSource = TipoExamenDAO.obtenerTodosTipoExamen();
            ddlTipoExamen.DataTextField = "Descripcion";
            ddlTipoExamen.DataValueField = "IdTipoExamen";
            ddlTipoExamen.DataBind();
        }
        catch (Exception ex)
        {
            lblMenTipoEx.Text = ex.Message.ToString();
            lblMenTipoEx.ForeColor = System.Drawing.Color.Red;
        }
    }//Fin metodo cargarTipoExamen
    private void cargarCurso()
    {
        try
        {
            ddlCurso.DataSource = CursoDAO.obtenerCursos();
            ddlCurso.DataTextField = "Nombre";
            ddlCurso.DataValueField = "IdCurso";
            ddlCurso.DataBind();
        }
        catch (Exception ex)
        {
            lblMenCurso.Text = ex.Message.ToString();
            lblMenCurso.ForeColor = System.Drawing.Color.Red;
        }
    }//Fin metodo cargarCurso
    protected void btnBuscar_Click(object sender, EventArgs e)
    {
        //Hago una validacion del lado del servidor
        if (!Page.IsValid)
        {
            lblResultadoBus.Text = "Debe ingresar un numero en el campo legajo";
            lblResultadoBus.ForeColor = System.Drawing.Color.Red;
            return;
        }

        cargarGrillaProfesor();
    }
    private void cargarGrillaProfesor()
    {
        //Declaro variables aux para almacenar lo que tienen los textbox
        List<Profesor> listaProfesor = new List<Profesor>();
        string nom = null;
        string ape = null;
        int? leg = null;
        if (txtNombreBus.Text != string.Empty)
            nom = txtNombreBus.Text;
        if (txtLegajoBus.Text != string.Empty)
            leg = int.Parse(txtLegajoBus.Text);
        if (txtApellidoBus.Text != string.Empty)
            ape = txtApellidoBus.Text;
        try
        {
            listaProfesor = ProfesorDAO.obtenerTodosProfesor(ViewState["Orden"].ToString(), nom, leg, ape);
        }
        catch (Exception ex)
        {
            lblResultadoBus.Text = ex.Message.ToString();
            lblResultadoBus.ForeColor = System.Drawing.Color.Red;
        }

        grillaProfesores.DataSource = listaProfesor;
        //Se establece identificador unico de la fila
        grillaProfesores.DataKeyNames = new string[] { "IdProfesor" };
        grillaProfesores.DataBind();
        if (listaProfesor.Count != 0)
        {
            lblResultadoBus.Text = "Busqueda Exitosa...";
            lblResultadoBus.ForeColor = System.Drawing.Color.Green;
        }
        else
        {
            lblResultadoBus.Text = "No hay resultados para esa busqueda...";
            lblResultadoBus.ForeColor = System.Drawing.Color.Red;
        }
        
    }
    //Evento para limpiar textbox de la busqueda de profesor
    protected void btnLimpiar_Click(object sender, EventArgs e)
    {
        limpiarBuscar();
    }
    //Evento para salir de la busqueda de profesor
    protected void btnVolverBus_Click(object sender, EventArgs e)
    {
        limpiarBuscar();
        panelProfesor.Visible = false;
    }
    //Evento para buscar un profesor
    protected void btnBuscar_Click1(object sender, EventArgs e)
    {
        limpiarBuscar();
        panelProfesor.Visible = true;
    }
    //Evento para el paginado de la grilla
    protected void grillaProfesores_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        grillaProfesores.PageIndex = e.NewPageIndex;
        cargarGrillaProfesor();
    }
    //Evento para seleccionar un profesor
    protected void grillaProfesores_SelectedIndexChanged(object sender, EventArgs e)
    {
        int idProfesor = int.Parse(grillaProfesores.SelectedDataKey.Value.ToString());
        Profesor profe;
        try
        {
            profe = ProfesorDAO.obtenerProfesorPorId(idProfesor);
            txtLegajo.Text = profe.Legajo.ToString();
            Session["IdProfesor"] = profe.IdProfesor;
        }
        catch (Exception ex)
        {
            lblResLegajo.Text = ex.Message.ToString();
            lblResLegajo.ForeColor = System.Drawing.Color.Red;
        }
        panelProfesor.Visible = false;
        
    }
    //Evento para ordenar la grilla de Profesores
    protected void grillaProfesores_Sorting(object sender, GridViewSortEventArgs e)
    {
        ViewState["Orden"] = e.SortExpression;
        cargarGrillaProfesor();
    }
    //------------------------------Tratamiento de Notas de Alumnos-----------------------
    //Evento para realizar la busqueda de alumno de un curso particular
    protected void btnBusAlumno_Click(object sender, EventArgs e)
    {
        //Hago una validacion del lado del servidor
        if (!Page.IsValid)
        {
            lblResBusAlumno.Text = "Debe ingresar un numero en el campo legajo";
            lblResBusAlumno.ForeColor = System.Drawing.Color.Red;
            return;
        }

        cargarGrillaAlumno();
    }
    private void cargarGrillaAlumno()
    {
        //Declaro variables aux para almacenar lo que tienen los textbox
        List<MatriculaAlumnoXCursoConsulta> listaAlumnoXCurso = new List<MatriculaAlumnoXCursoConsulta>();
        string nom = null;
        string ape = null;
        int? leg = null;
        if (txtNombreAlumnoBus.Text != string.Empty)
            nom = txtNombreAlumnoBus.Text;
        if (txtLegajoAlumnoBus.Text != string.Empty)
            leg = int.Parse(txtLegajoAlumnoBus.Text);
        if (txtApellidoAlumnoBus.Text != string.Empty)
            ape = txtApellidoAlumnoBus.Text;
        int idCurso = int.Parse(ddlCurso.SelectedValue);
        try
        {
            listaAlumnoXCurso = MatriculaDAO.obtenerAlumnoXCurso(ViewState["OrdenAlumno"].ToString(), idCurso, leg, nom, ape);
        }
        catch (Exception ex)
        {
            lblResBusAlumno.Text = ex.Message.ToString();
            lblResBusAlumno.ForeColor = System.Drawing.Color.Red;
        }

        grillaBusAlumnos.DataSource = listaAlumnoXCurso;
        //Se establece identificador unico de la fila
        grillaBusAlumnos.DataKeyNames = new string[] { "IdAlumno" };
        grillaBusAlumnos.DataBind();
        if (listaAlumnoXCurso.Count != 0)
        {
            lblResBusAlumno.Text = "Busqueda Exitosa...";
            lblResBusAlumno.ForeColor = System.Drawing.Color.Green;
        }
        else
        {
            lblResBusAlumno.Text = "No hay resultados para esa busqueda...";
            lblResBusAlumno.ForeColor = System.Drawing.Color.Red;
        }
    }
    protected void btnLimpiarAlumno_Click(object sender, EventArgs e)
    {
        limpiarBuscarAlumno();
    }
    protected void btnSalirBusAlumno_Click(object sender, EventArgs e)
    {
        limpiarBuscarAlumno();
        panelBuscarAlumno.Visible = false;
    }
    //-----------------------------------------------------------------------
    //Metodo que guarda un examen con su detalle
    protected void btnGuardar_Click(object sender, EventArgs e)
    {
        
        if (!Page.IsValid)
        {
            lblResOperacion.Text = "Existen campos invalidos...";
            lblResOperacion.ForeColor = System.Drawing.Color.Red;
            return;
        }
        if (Session["ListaDetalle"] == null)
        {
            lblResOperacion.Text = "Se debe agregar por lo menos una nota";
            lblResOperacion.ForeColor = System.Drawing.Color.Red;
            return;
        }
        List<DetalleExamen> listaDetalle = (List<DetalleExamen>)Session["ListaDetalle"];
        Examen examen = new Examen();
        examen.Fecha = DateTime.Parse(txtFecha.Text);
        examen.Hora = TimeSpan.Parse(txtHoraEx.Text);
        examen.IdCurso = int.Parse(ddlCurso.SelectedValue);
        examen.IdTipoExamen = int.Parse(ddlTipoExamen.SelectedValue);
        examen.IdProfesor = int.Parse(Session["IdProfesor"].ToString());
        examen.Numero = int.Parse(txtNumEx.Text);
        try
        {
            ExamenDAO.guardarExamen(examen, listaDetalle);
            lblResOperacion.Text = "La operacion se realizo con exito...";
            lblResOperacion.ForeColor = System.Drawing.Color.Green;
        }
        catch (Exception ex)
        {
            lblResOperacion.Text = ex.Message.ToString();
            lblResOperacion.ForeColor = System.Drawing.Color.Red;
        }
        
        limpiarExamen();
    }
    //----------------------------------------------------------------------
    protected void btnVolver_Click(object sender, EventArgs e)
    {
        //Vuelve a la pagina de inicio de Administracion
        Response.Redirect("~/Administracion/Administracion.aspx");
    }
    protected void btnAgregarNota_Click(object sender, EventArgs e)
    {
        if (!Page.IsValid)
        {
            lblResLegajoAlumno.Text = "Algunos de los compos no es valido";
            lblResLegajoAlumno.ForeColor = System.Drawing.Color.Red;
            return;
        }
        List<DetalleExamen> listaDetalle;
        //Esta parte es para mostrar datos representativos en la grilla nada mas
        List<ExamenConsulta> listaParaMostrar;
        if (Session["ListaExamenConsulta"] != null)
            listaParaMostrar = (List<ExamenConsulta>)Session["ListaExamenConsulta"];
        else
            listaParaMostrar = new List<ExamenConsulta>();
        //***********************************************************************
        if (Session["ListaDetalle"] != null)
            listaDetalle = (List<DetalleExamen>)Session["ListaDetalle"];
        else
            listaDetalle = new List<DetalleExamen>();

        DetalleExamen detEx = new DetalleExamen();
        ExamenConsulta examenConsulta = new ExamenConsulta();//Es solo para mostrar datos en la grilla
        Alumno alumno = (Alumno)Session["AlumnoExamen"];//Es solo para mostrar datos en la grilla
        if (Session["IdAlumno"] == null)
        {
            try
            {
                detEx.IdAlumno = AlumnoDAO.obtenerIdXLegajo(int.Parse(txtLegajoAlumno.Text));                
            }
            catch (Exception ex)
            {
                lblResLegajoAlumno.Text = ex.Message.ToString();
                lblResLegajoAlumno.ForeColor = System.Drawing.Color.Red;
            }
        }
        else
            detEx.IdAlumno = int.Parse(Session["IdAlumno"].ToString());

        //Controlo que no se agregue otra nota a un alumno
        if (!contieneAlumnoLista(detEx.IdAlumno, listaDetalle))
        {
            detEx.Nota = int.Parse(txtNotaAlumno.Text);
            if (!string.IsNullOrEmpty(txtDescripcion.Text))
                detEx.Descripcion = txtDescripcion.Text;
                
            listaDetalle.Add(detEx);
            Session["ListaDetalle"] = listaDetalle;
            examenConsulta.LegajoAlumno = alumno.Legajo;
            examenConsulta.NombreAlumno = alumno.Nombre;
            examenConsulta.ApellidoAlumno = alumno.Apellido;
            examenConsulta.Nota = detEx.Nota;
            listaParaMostrar.Add(examenConsulta);
            Session["ListaExamenConsulta"] = listaParaMostrar;
            
            grillaNotas.DataSource = listaParaMostrar;
            grillaNotas.DataBind();
            grillaNotas.Visible = true;
            
            detEx = null;
            limpiarNotas();
            lblResOperacion.Text = string.Empty;
        }
        else
        {
            lblResOperacion.Text = "Ese alumno ya tiene cargado la nota...Seleccione otro alumno";
            lblResOperacion.ForeColor = System.Drawing.Color.Red;
            detEx = null;
            limpiarNotas();
            return;
        }
        

    }
    //Metodo para controlar que un alumno tenga una sola nota
    private bool contieneAlumnoLista(int id, List<DetalleExamen> listaDetalle)
    {
        foreach (DetalleExamen detalle in listaDetalle)
        {
            if (detalle.IdAlumno == id)
                return true;
        }
        return false;
    }
    private void limpiarNotas()
    {
        txtDescripcion.Text = string.Empty;
        txtNotaAlumno.Text = string.Empty;
        txtLegajoAlumno.Text = string.Empty;
        Session["IdAlumno"] = null;
        Session["AlumnoExamen"] = null;
    }
    private void limpiarExamen()
    {
        txtFecha.Text = string.Empty;
        txtHoraEx.Text = string.Empty;
        txtLegajo.Text = string.Empty;
        txtNumEx.Text = string.Empty;
        Session["IdProfesor"] = null;
        Session["IdAlumno"] = null;
        Session["ListaDetalle"] = null;
        Session["ListaExamenConsulta"] = null;
        grillaNotas.Visible = false;
    }
    //Evento para habilitar la busqueda de alumno
    protected void btnBuscarAlumno_Click(object sender, EventArgs e)
    {
        limpiarBuscarAlumno();
        panelBuscarAlumno.Visible = true;
               
    }
    private void limpiarBuscarAlumno()
    {
        txtLegajoAlumnoBus.Text = string.Empty;
        txtNombreAlumnoBus.Text = string.Empty;
        txtApellidoAlumnoBus.Text = string.Empty;
        lblResBusAlumno.Text = string.Empty;
    }
    protected void grillaBusAlumnos_SelectedIndexChanged(object sender, EventArgs e)
    {
        int idAlumno = int.Parse(grillaBusAlumnos.SelectedDataKey.Value.ToString());
        Alumno alum;
        try
        {
            alum = AlumnoDAO.ObtenerPorId(idAlumno);
            Session["AlumnoExamen"] = alum;
            txtLegajoAlumno.Text = alum.Legajo.ToString();
            Session["IdAlumno"] = alum.IdAlumno;
        }
        catch (Exception ex)
        {
            lblResLegajoAlumno.Text = ex.Message.ToString();
            lblResLegajoAlumno.ForeColor = System.Drawing.Color.Red;
        }
        panelBuscarAlumno.Visible = false;
    }
    protected void grillaBusAlumnos_Sorting(object sender, GridViewSortEventArgs e)
    {
        ViewState["Orden"] = e.SortExpression;
        cargarGrillaAlumno();
    }

    protected void grillaBusAlumnos_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        grillaBusAlumnos.PageIndex = e.NewPageIndex;
        cargarGrillaAlumno();
    }
    protected void btnConsultarExamen_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Administracion/ConsultaExamen.aspx");
    }
    protected void btnCerrarSesion_Click(object sender, EventArgs e)
    {
        ////Eliminar la cookie
        //Context.Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now;
        ////Terminar la Sesion
        //FormsAuthentication.SignOut();
        //Response.Redirect("~/Publico/InicioWF.aspx");

        //************************************************************
        //Otra forma de eliminar la cookie del equipo del usuario
        if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
        {
            HttpCookie paraBorrar = new HttpCookie(FormsAuthentication.FormsCookieName);
            paraBorrar.Expires = DateTime.Now.AddDays(-1d);
            Response.Cookies.Add(paraBorrar);
        }
        FormsAuthentication.SignOut();
        Session.Abandon();
        Response.Redirect("~/Publico/InicioWF.aspx");
    }
}